Domain PrimitiveとParse don't validate
昔からある概念ではあるもののこれを整理して紹介しているSecure by Designに見られるDomain Primitives(ドメイン固有型)とParse don't validateは、同じことを意味していると思われる。
Domain Primitives
Secure by Designの定義より
Domain Primitivesは、定義が厳密なValue Objectであり、Validなものしか存在できない。
DDDにおけるValue Objectとの違いは、生成時に不変条件を満たすことを強制することである。
ここの定義で「Value Object」という用語を使っているのは、人によってイメージするものが異なる恐れがあるのであまりよろしくない。そこに囚われず、Always-Validなドメイン固有の型である、という理解をすると良さそう。言い換えると「外部からの入力データをバリデーションし業務として定義された型にパースしたもの」と言える。
Parse don't validate
アプリケーションロジックとして受け取ることができる(Validな)データを型として表現する。
Validationではなくて、この型にマッピングする(パースする)し、これを前提にアプリケーションを組み立てることで、うっかりValidじゃないものを扱ってしまうバグや脆弱性の混入を防ぐ。
両者の共通点
アプリケーションロジックとしてValidなデータを型として担保する
入力のすべてを前もってパースする。
トレードオフ
Domain Primitives, Parse don't validateの言うように、言語で用意されている型ではアプリケーションロジック側で何らかのバリデーションを実装する必要のあるものは、それ毎に型を作ることになる。
この点、Secure by Designでは以下のように述べているが、別に言語プリミティブで構わないものもあるので、私は行き過ぎた主張だと考える。
ドメインモデルでは、言語プリミティブや汎用型では何も表現してはならない。各概念はドメインプリミティブとしてモデル化されるべきで,そうすることで,その概念は受け渡されるときに意味を持ち,不変条件を維持することができる
ただ、それでも